跳到主要内容

Nacos 服务注册与负载均衡

引入依赖

首先引入 Spring Cloud Alibaba 的大礼包

<!--spring cloud 阿里巴巴-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>

在子模块中引入服务发现的包

<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

创建生产者

这里消费者生产者只是一个称呼,其实彼此都可以作为生产者或者消费者,这里只是用来测试负载均衡效果而已

编写配置文件

spring:
cloud:
nacos:
discovery: # 配置服务发现
server-addr: 192.168.211.138:8848 # 配置 Nacos 地址

# 要把自己暴露出来
management:
endpoints:
web:
exposure:
include: '*' #监控

启动类:

// 这里使用 @EnableDiscoveryClient 注解启动服务发现
@SpringBootApplication
@EnableDiscoveryClient
public class PaymentMain9001 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain9001.class,args);
}
}

编写测试 Controller

@RestController
public class PaymentController {
@Value("${server.port}")
private String serverPort;

@GetMapping("/payment/nacos/{id}")
public String getPayment(@PathVariable("id") Integer id) {
return "Nacos registry,serverPort: " + serverPort + "\t id" + id;
}
}

再点开 Nacos 就可以看到这个服务了

创建消费者

上面已经注册了一个生产者了,这里再创建一个消费者

同样引入服务发现的包,然后编写配置文件

spring:
application:
name: nacos-order-consumer
cloud:
nacos:
discovery:
server-addr: 192.168.211.138:8848

# 消费者将要去访问的微服务名称(成功注册进 nacos 的微服务提供者),这个是自定义的配置,方便 Cotroller 直接读取,无需写死
service-url:
nacos-user-service: http://nacos-payment-provider

配置一个 RestTemplate 用来发送请求:

@Configuration
public class ApplicationContextConfig {
// RestTemplate 结合 Ribbon 做负载均衡一定要加 @LoadBalanced 否则会报错
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}

编写 Controller

@RestController
public class OrderNacosController {
/*
因为在 yml 中配置了 service-url.nacos-user-service,这里不需要再定义要访问微服务名常量,而是直接读配置
*/
@Value("${service-url.nacos-user-service}")
private String serverURL;

@Resource
private RestTemplate restTemplate;

@GetMapping("/consumer/payment/nacos/{id}")
public String paymentInfo(@PathVariable("id") Long id) {
return restTemplate.getForObject(serverURL + "/payment/nacos/" + id, String.class);
}
}

然后访问这个接口,可以发现两次的结果不同:

可以看到没有主动引入 Ribbon 也自动负载均衡了,其实就是因为 Ailbaba 自带了 Ribbon